package Persistencia;

import java.awt.List;
import java.sql.*;
import java.util.LinkedList;
import java.util.Vector;

public class AgenteBD {
	// instancia del agente
		protected static AgenteBD mInstancia = null;
		// Conexion con la base de datos
		protected static Connection mBD;
		// Identificador ODBC de la base de datos
		private static String url = "jdbc:odbc:ISO2BBDD";
		// Driven para conectar con bases de datos Microsoft Access
		private static String driver = "sun.jdbc.odbc.JdbcOdbcDriver";

		// Constructor
		private AgenteBD() throws Exception {
			conectar();

		}

		// Implementacion del patron singleton
		// Este patron de diseÃ¯Â¿Â½o permite implementar clases de las cuales
		// solo existir una instancia
		// http://es.wikipedia.org/wiki/Singleton
		public static AgenteBD getAgente() throws Exception {
			if (mInstancia == null) {
				mInstancia = new AgenteBD();
			}
			return mInstancia;
		}

		// Metodo para realizar la conexion a la base de datos
		private void conectar() throws Exception {
			Class.forName(driver);
			mBD = DriverManager.getConnection(url);
		}

		// Metodo para desconectar de la base de datos
		public void desconectar() throws Exception {
			mBD.close();
		}

		// Metodo para realizar una insercion en la base de datos
		public int insert(String SQL) throws SQLException, Exception {
			conectar();
			PreparedStatement stmt = mBD.prepareStatement(SQL);
			int res = stmt.executeUpdate();
			// stmt.close();
			// desconectar();
			return res;
		}

		// Metodo para realizar una eliminacion en la base de datos
		public int delete(String SQL) throws SQLException, Exception {
			PreparedStatement stmt = mBD.prepareStatement(SQL);
			int res = stmt.executeUpdate();
			// stmt.close();
			// desconectar();
			return res;
		}

		// Metodo para realizar una eliminacion en la base de datos
		public int update(String SQL) throws SQLException, Exception {
			conectar();
			PreparedStatement stmt = mBD.prepareStatement(SQL);
			int res = stmt.executeUpdate();
			// stmt.close();
			// desconectar();
			return res;
		}

		@SuppressWarnings({ "rawtypes", "unchecked" })
		public Vector select(String SQL) throws SQLException, Exception {
			int numColumnas = 0;
			Vector resul = new Vector();
			Vector reg = new Vector();

			PreparedStatement sentencia = mBD.prepareStatement(SQL);
			ResultSet respuesta = sentencia.executeQuery();

			ResultSetMetaData rsmd = respuesta.getMetaData();
			numColumnas = rsmd.getColumnCount();

			while (respuesta.next()) {
				reg = new Vector();
				for (int i = 1; i <= numColumnas; i++) {
					switch (rsmd.getColumnType(i)) {
					case Types.VARCHAR:
						reg.add(respuesta.getString(i));
						break;
					case Types.INTEGER:
						reg.add(new Integer(respuesta.getInt(i)));
						break;
					case Types.DOUBLE:
						reg.add(new Double(respuesta.getDouble(i)));
						break;
					}
				}
				resul.add(reg);
			}
			respuesta.close();
			// sentencia.close();
			// desconectar();
			return resul;
		}
		public ResultSet selectPedido(String SQL)throws SQLException, Exception {
			PreparedStatement sentencia = mBD.prepareStatement(SQL);
			ResultSet respuesta = sentencia.executeQuery();
			return respuesta;

		}
		public ResultSet selectAll(String SQL)throws SQLException, Exception {
			PreparedStatement sentencia = mBD.prepareStatement(SQL);
			ResultSet respuesta = sentencia.executeQuery();
			return respuesta;

		}

}
